package websocket;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * Process Class Container
 * xml文件解析类
 * 通过这个类来找到各个消息所对应的处理函数
 * @author huanghaiyun
 * @createTime 2016-2-19下午05:58:28
 */
public class PCContainer {
	private static final PCContainer INSTANCE=new PCContainer();
	private PCContainer() {
		// TODO Auto-generated constructor stub
	}
	public static PCContainer getInstance(){
		return INSTANCE;
	}
	/**
	 * 通过消息的类型，与xml文件对应，
	 * 找寻到他们对应的处理类进行消息处理
	 * @param msg 消息的实体
	 * @return 消息
	 */
	public Object getProcessClass(NotifyMsg msg){
		Element element = null;
		  
		  File f = new File("WebRoot/notifyProcess.xml");

		  // documentBuilder为抽象不能直接实例化(将XML文件转换为DOM文件)
		  DocumentBuilder db = null;
		  DocumentBuilderFactory dbf = null;
		  try {
		   // 返回documentBuilderFactory对象
		   dbf = DocumentBuilderFactory.newInstance();
		   // 返回db对象用documentBuilderFatory对象获得返回documentBuildr对象
		   db = dbf.newDocumentBuilder();

		   // 得到一个DOM并返回给document对象
		   Document dt = db.parse(f);
		   // 得到一个elment根元素
		   element = dt.getDocumentElement();
		   // 获得根节点
//		   System.out.println("根元素：" + element.getNodeName());

		   // 获得根元素下的子节点
		   NodeList childNodes = element.getChildNodes();

		   // 遍历这些子节点
		   for (int i = 0; i < childNodes.getLength(); i++) {
			   // 获得每个对应位置i的结点
			   Node node1 = childNodes.item(i);
			   if ("type".equals(node1.getNodeName())) {
				   if(node1.getAttributes().getNamedItem("type").getNodeValue().equals(msg.getMsgType())){
					   
					   NodeList nodeDetail = node1.getChildNodes();
					   for (int j = 0; j < nodeDetail.getLength(); j++) {
						   
						   Node detail = nodeDetail.item(j);
						   if ("processClass".equals(detail.getNodeName())) {
							  Class classz=Class.forName(detail.getTextContent());
							  Object obj=classz.newInstance();
							  return obj;
//							   return ((MsgProcess) obj).getMsg(msg);
							  
						   }
					   }
				   }
			   }

		   }
		  }

		  catch (Exception e) {
			  e.printStackTrace();
		  }
		return null;
	}
}
